package com.taotao.portal.service.ipml;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.CookieUtils;
import com.taotao.common.utils.HttpClientUtil;
import com.taotao.common.utils.JsonUtils;
import com.taotao.common.utils.SessionUtil;
import com.taotao.pojo.TbItem;
import com.taotao.portal.pojo.CartItem;
import com.taotao.portal.service.ICartService;

@Service
public class CartServiceIpml implements ICartService {

	@Value("${REST_BASE_URL}")
	private String REST_BASE_URL;

	@Value("${ITME_INFO_URL}")
	private String ITME_INFO_URL;

	@Value("${TT_CART}")
	private String TT_CART;

	/**
	 * 添加购物车
	 */
	@Override
	public TaotaoResult AddItemToCart(Long itemId, Integer num,
			HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		List<CartItem> cartItems = null;
		cartItems = getCartItems(request);
		if (null != cartItems) {
			if (!hasItem(cartItems, itemId)) {
				// 通过商品id获取商品信息
				String doGet = HttpClientUtil.doGet(REST_BASE_URL

				+ ITME_INFO_URL + itemId);
				if (StringUtils.isNotBlank(doGet)) {
					CartItem citem = jsonToTbItem(doGet);
					cartItems.add(citem);
				}
			}
			// 将购物车信息储存到cookie
			String cookieValue = JsonUtils.objectToJson(cartItems);
			CookieUtils
					.setCookie(request, response, TT_CART, cookieValue, true);
			return TaotaoResult.ok();
		}
		return TaotaoResult.build(400, "获取商品失败");
	}

	/**
	 * 获取购物车列表
	 * 
	 * @param request
	 * @return
	 */
	private List<CartItem> getCartItems(HttpServletRequest request) {
		// TODO Auto-generated method stub
		String cookieJson = CookieUtils.getCookieValue(request, TT_CART, true);
		if (StringUtils.isNotBlank(cookieJson)) {
			return JsonUtils.jsonToList(cookieJson, CartItem.class);
		} else {
			return new ArrayList<CartItem>();
		}
	}

	/**
	 * 判断购物车中是否含所有该物品
	 * 
	 * @param cartItems
	 * @param itemId
	 * @return
	 */
	private boolean hasItem(List<CartItem> cartItems, Long itemId) {
		// TODO Auto-generated method stub
		for (CartItem cartItem : cartItems) {
			if (cartItem.getId() == itemId) {
				// 判断购物车是否含所有此商品
				cartItem.setNum(cartItem.getNum() + 1);
				return true;
			}
		}
		return false;
	}

	public List<CartItem> getCartItemList(HttpServletRequest request) {
		List<CartItem> cartItemList = getCartItems(request);
		return cartItemList;
	}

	/**
	 * 将购物车中的商品信息存入session
	 */
	// @Override
	// public TaotaoResult AddItemToCart(Long itemId, Integer num,
	// HttpServletRequest request, HttpServletResponse response) {
	// // TODO Auto-generated method stub
	// List<CartItem> cartItems = getCartItemListBySession(request);
	// if (!hasItem(cartItems, itemId)) {
	// String doGet = HttpClientUtil.doGet(REST_BASE_URL + ITME_INFO_URL
	// + itemId);
	// if (StringUtils.isNotBlank(doGet)) {
	// CartItem cItem = jsonToTbItem(doGet);
	// cartItems.add(cItem);
	// }
	// // 将session中的数据进行更新
	// String cartItemJson = JsonUtils.objectToJson(cartItems);
	// SessionUtil.setAttribute(request, "cart", cartItemJson);
	// return TaotaoResult.ok();
	// }
	// return TaotaoResult.build(400, "商品添加失败");
	// }

	/**
	 * 将json变成TbItem
	 * 
	 * @param doGet
	 * @return
	 */
	private CartItem jsonToTbItem(String doGet) {
		TaotaoResult taotaoResult = TaotaoResult.formatToPojo(doGet,
				TbItem.class);
		TbItem item = (TbItem) taotaoResult.getData();
		CartItem cItem = new CartItem();
		cItem.setId(item.getId());
		cItem.setTitle(item.getTitle());
		cItem.setPrice(item.getPrice());
		cItem.setImage(StringUtils.isNotBlank(item.getImage()) ? item
				.getImage().split(",")[0] : "");
		cItem.setNum(1);
		return cItem;
	}

	/**
	 * 从session中获取购物车信息
	 * 
	 * @param request
	 * @return
	 */
	private List<CartItem> getCartItemListBySession(HttpServletRequest request) {
		// TODO Auto-generated method stub
		String cartStr = (String) SessionUtil.getAttribute(request, "cart");
		if (StringUtils.isBlank(cartStr)) {
			return new ArrayList<CartItem>();
		} else {
			List<CartItem> cartItems = JsonUtils.jsonToList(cartStr,
					CartItem.class);
			return cartItems;
		}

	}

	/**
	 * 修改商品数量
	 */
	@Override
	public TaotaoResult updateCartItemCountByItemId(HttpServletRequest request,
			HttpServletResponse response, Long itemId, Integer num) {
		// TODO Auto-generated method stub
		// 获取购物车中的数据
		if (null == itemId || null == num) {
			return TaotaoResult.build(400, "修改失败");
		}
		List<CartItem> cartItems = getCartItems(request);
		updateCartItemCount(cartItems, itemId, num);
		String cookieValue = JsonUtils.objectToJson(cartItems);
		// 将数据写入cookie
		CookieUtils.setCookie(request, response, TT_CART, cookieValue, true);
		return TaotaoResult.ok();
	}

	/**
	 * 修改数量信息
	 * 
	 * @param cartItems
	 * 
	 * @param itemId
	 * @param num
	 */
	private void updateCartItemCount(List<CartItem> cartItems, Long itemId,
			Integer num) {
		// TODO Auto-generated method stub
		for (CartItem cartItem : cartItems) {
			if (cartItem.getId() == itemId) {
				cartItem.setNum(num);
				return;
			}
		}
	}

	@Override
	public TaotaoResult deleteCartItem(HttpServletRequest request,
			HttpServletResponse response, Long itemId) {
		// TODO Auto-generated method stub
		List<CartItem> cartItems = getCartItems(request);
		for (CartItem cartItem : cartItems) {
			if (cartItem.getId() == itemId) {
				cartItems.remove(cartItem);
				// 更新cookie数据
				String cookieValue = JsonUtils.objectToJson(cartItems);
				CookieUtils.setCookie(request, response, TT_CART, cookieValue);
				return TaotaoResult.ok();
			}
		}
		return TaotaoResult.build(400, "删除失败");
	}
}
